<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Realiza a interacao entre a aplicacao e a tabela de locacoes no banco de dados
 * 
 * @package application/models/adm
 * @name Locacao_model
 * @author Joao Claudio Dias Araujo <joao.araujo@tellks.com.br>
 */
class Locacao_model extends CI_Model{
    
    private $tabela;
    
    function __construct() {
        parent::__construct();
        
        $this->tabela = 'locacao';
    }
            
    /**
     * Busca todos os locacoes do banco de dados
     * 
     * @return array
     */
    function get_all(){
        
        $locacoes = $this->db->get($this->tabela);
        
        if($locacoes->num_rows() > 0){
            
            return $locacoes->result();
        }
        else {
            
            return array();
        }
    }
    
    /**
     * Busca os dados de um locacao pelo seu ID
     * 
     * @param int $id ID do categoria
     * @return mixed
     */
    
    function get_by_id($id){
        
        $this->db->select('l.*, c.id AS cliente_id, c.nome AS nome_cliente, lf.filme_id, f.nome AS nome_filme, f.valor AS valor_filme');
        
        $this->db->from($this->tabela .  ' AS l');
        
        $this->db->join('cliente AS c', 'c.id = l.cliente', 'LEFT');
        
        $this->db->join('locacao_filme AS lf', 'lf.locacao_id = l.id', 'LEFT');
        
        $this->db->join('filme AS f', 'lf.filme_id = f.id', 'LEFT');
        
        $this->db->where('l.id', $id);
        
        $resultado = $this->db->get();
        
        if($resultado->num_rows() > 0){
            
            $locacao = $resultado->row(0);
            
            $locacao->filmes = array();
            
            foreach ($resultado->result() as $f){
                $filme = new stdClass();
                $filme->id = $f->filme_id;
                $filme->nome = $f->nome_filme;
                $filme->valor = $f->valor_filme;
                $locacao->filmes[] = $filme;
            }
            
            return $locacao;
        }
        else{
            
            return false;
        }
        
    }

    
    function get_locacoes(){
        
        $this->db->select('l.*, c.id AS cliente_id, c.nome AS nome_cliente, lf.filme_id');
        
        $this->db->from($this->tabela .  ' AS l');
        
        $this->db->join('cliente AS c', 'c.id = l.cliente', 'LEFT');
        
        $this->db->join('locacao_filme AS lf', 'lf.locacao_id = l.id', 'LEFT');
        
        $this->db->order_by('l.data DESC');
        
        $this->db->order_by('nome_cliente');
        
        $resultado = $this->db->get();
        
        if($resultado->num_rows() > 0){
                                    
            return $resultado->result();
        }
        else{
            
            return false;
        }
        
    }
         
    /**
     * Insere um locacao no banco de dados
     * 
     * @param sdtClass Object $locacao Objeto contendo os dados do locacao
     * @return boolean
     */
    function inserir($locacao){
        
        
      
        $filmes = $locacao->filmes;
        
        unset($locacao->filmes);
        
        $this->db->insert($this->tabela, $locacao);
        
        $inseriu_locacao = (bool)  $this->db->affected_rows();
        
        $id = $this->db->insert_id();
        
        $inseriu_filmes = $this->salvar_filmes($id,$filmes);
        
        
        return($inseriu_locacao && $inseriu_filmes);
    }
    
    /**
     * atualiza um locacao no banco de dados
     * 
     * @param sdtClass Object $locacao Objeto contendo os dados do locacao
     * @return boolean
     */
    function atualizar($locacao){
        
        $filmes = $locacao->filmes;
        
        unset($locacao->filmes);
        
        $this->db->where('id', (int)$locacao->id);
        
        $this->db->update($this->tabela,$locacao);
        
        $atualizou_locacao = (bool)$this->db->affected_rows();
        
        $removeu_filmes = $this->remover_filmes($locacao->id);
        
        $inseriu_filmes = $this->salvar_filmes($locacao->id, $filmes);
        
        return ($atualizou_locacao || ($removeu_filmes || $inseriu_filmes));
    }
    
    /**
     * Remove um locacao do banco de dados
     * 
     * @param int $id ID do locacao a ser removido
     * @return boolean
     */
    function remover($id){
        
        $this->db->where('id', (int)$id);
        
        $this->db->delete($this->tabela);
        
        return (bool)$this->db->affected_rows();
    }
    
    /**
     * Insere o locacao nos categorias recebidos por paramentro
     * 
     * @param int $id ID do locacao
     * @param array $categorias Grupos do locacao
     * @return boolean
     */
    function salvar_filmes($id, $filmes){
        
        $insert_array = array();
        
        //Itera sob os categorias selecionados no formulario preparando o array para 
        // Insercao em lote
        foreach ($filmes as $f){
            
            $insert_array[] = array(
                'locacao_id' => $id,
                'filme_id'   => $f
            );
        }
        
        // Se ha valores a serem inseridos
        if(sizeof($insert_array) > 0 ){
            
            // Realiza a insercao em lote
            $this->db->insert_batch('locacao_filme', $insert_array);
            
            return (bool)$this->db->affected_rows();
        }
        
        return true;
    }
         
    /**
     * Retira o locacao de todos os categorias em que ele esteja inserido
     * @param int $id ID do locacao
     * @return boolean
     */
    function remover_filmes($id){
        
        $this->db->where('locacao_id',(int)$id);
        
        $this->db->delete('locacao_filme');
        
        return (bool)$this->db->affected_rows();
    }
    
    
    
}